/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.seguridad.web;

import isd.general.util.JsfUtil;
import isd.seguridad.modelo.SG_Menu;

import isd.seguridad.modelo.SG_Usuario;
import isd.seguridad.modelo.SG_UsuarioMenu;
import isd.seguridad.rn.SG_MenuRN;
import isd.seguridad.rn.SG_UsuarioRN;

import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

/**
 *
 * @author Pablo
 */
@ManagedBean
@ViewScoped
public class PermisosBean implements Serializable{

  @EJB private SG_UsuarioRN usuarioRN;
  @EJB private SG_MenuRN menuRN;

  private SG_Usuario usuario;
  private List<SG_Usuario> lista;
  private TreeNode menu;
  private TreeNode nodoSeleccionado;

    /** Creates a new instance of UsuarioMB */
    public PermisosBean() {

    }

    @PostConstruct
    public void init(){        
       lista = usuarioRN.getLista();
       menu = new DefaultTreeNode();       
    }

    public void guardar(){

    }

    public void seleccionar(SG_Usuario u){
        usuario = u;
        //Actualizamos la lista de menu del usuario
        u.setMenu(menuRN.getMenuByUsuario(usuario));
        //Generamos un nuevo arbol
        menu = new DefaultTreeNode();
        //Generamos el arbol para el usuario
        generarArbol(menu,menuRN.getListaByNivel(1,false));
    }

    public void cargarMenu(){

        menu = new DefaultTreeNode();
        generarArbol(menu,menuRN.getListaByNivel(1,false));
    }

    private void generarArbol(TreeNode raiz, List<SG_Menu> items){

        if (items.isEmpty())
            return;

        if (usuario==null) return;

        //Recorremos menu principal
        for(SG_Menu m: items){

            SG_UsuarioMenu um = new SG_UsuarioMenu(usuario.getId(), m.getId());
            TreeNode hoja = null;
            
            if(usuario.getMenu().contains(um)){
                hoja = new DefaultTreeNode("habilitado", m , raiz);
                hoja.setExpanded(true);
            }else{

                hoja = new DefaultTreeNode("bloqueado", m , raiz);
                hoja.setExpanded(true);
            }

            generarArbol(hoja, m.getMenuItem());
        }
    }

    public void habilitarMenu(){
        try {

            SG_Menu m = (SG_Menu) nodoSeleccionado.getData();
            
            menuRN.HabilitarMenu(usuario,m);

            usuario.setMenu(menuRN.getMenuByUsuario(usuario));
            cargarMenu();
            JsfUtil.addInfoMessage("El menú fue habilitado");
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("No es posible la habilitación");
        }
    }

    public void bloquearMenu(){
        try {

            SG_Menu m = (SG_Menu) nodoSeleccionado.getData();

            menuRN.BloquearMenu(usuario,m);

            usuario.setMenu(menuRN.getMenuByUsuario(usuario));
            cargarMenu();
            JsfUtil.addInfoMessage("El menú fue bloqueado");
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("No es posible el bloqueo");
        }        
    }

    public void eliminar(){

    }

    public List<SG_Usuario> getLista() {
        return lista;
    }

    public void setLista(List<SG_Usuario> lista) {
        this.lista = lista;
    }

    public TreeNode getMenu() {
        return menu;
    }

    public void setMenu(TreeNode menu) {
        this.menu = menu;
    }

    public TreeNode getNodoSeleccionado() {
        return nodoSeleccionado;
    }

    public void setNodoSeleccionado(TreeNode nodoSeleccionado) {
        this.nodoSeleccionado = nodoSeleccionado;
    }
    
    public SG_Usuario getUsuario() {
       return usuario;
    }

    public void setUsuario(SG_Usuario usuario) {
       this.usuario = usuario;
    }


}
